/*
      qsort函数的使用，以及利用冒泡排序模拟实现qsort函数

      夏思成

      2024年3月20日

      西安科技大学15号公寓楼
*/




//比较函数的函数名可以随意编写，我建议可以根据要比较数据的类型进行编写

//int compare_by_int(const void* p1, const void* p2)
//{
//    //我们排序的数据是整型的，而参数是void*类型，所以我们要将带比较的两个变量强制转换为int*型的
//    //强制转换后，我们在对其进行解引用，就可以拿到我们要比较的数据
//    //比较两个整型，我们只需要将两者相减即可
//
//    return *((int*)p1) - *((int*)p2);
//}



////比较整形数据函数
//int compare_by_int(const void* p1, const void* p2)
//{
//    return *((int*)p1) - *((int*)p2);
//}
//
////打印函数
//void Print_int(int* nums, size_t numsSize)
//{
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        printf("%d ", nums[i]);
//    }
//}
//
////排序整型数组函数
//void test1()
//{
//    int nums[] = { 10,9,8,7,6,5,4,3,2,1 };//待排序数组
//    int numsSize = sizeof(nums) / sizeof(nums[0]);//待排序数组的大小
//    qsort(nums, numsSize, sizeof(nums[0]), compare_by_int);
//    Print_int(nums, numsSize);//打印函数
//}
//int main()
//{
//    //排序整型数组
//    test1();
//    return 0;
//}

//struct student
//{
//    char name[64];
//    int age;
//};




//
////name成员是字符数组，所以比较它们，应该用字符串函数strcmp
//int compare_by_struct_name(const void* p1, const void* p2)
//{
//    //name是结构体的成员，故我们应该将其强制转换为结构体指针(struct student*)
//    //通过指针间接访问结构体成员需要使用访问操作符->
//    return strcmp(((struct student*)p1)->name, ((struct student*)p2)->name);
//}
//
////打印结构体变量函数
//void Print_struct_name(struct student* arr, size_t sz)
//{
//    int i = 0;
//    for (i = 0; i < sz; i++)
//    {
//        printf("%s---%d\n", arr->name, arr->age);
//        arr++;
//    }
//}
//
////依据结构体中name类型进行排序
//test2()
//{
//    //创建结构体变量
//    struct student x[3] = { {"zhangsan",31},{"lisi",17},{"wangwu",10}};
//    int sz = sizeof(x) / sizeof(x[0]);
//    qsort(x, sz, sizeof(x[0]), compare_by_struct_name);
//    Print_struct_name(x, sz);
//}
//int main()
//{
//    //依据结构体中name类型进行排序
//    test2();
//    return 0;
//}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
    char name[64];
    int age;
};


//比较整型成员函数
int compare_by_struct_age(const void* p1, const void* p2)
{
    //age是结构体的成员，故我们应该将其强制转换为结构体指针(struct student*)
    //通过指针间接访问结构体成员需要使用访问操作符->
    return ((struct student*)p1)->age - ((struct student*)p2)->age;
}

//打印结构体变量函数
void Print_struct_age(struct student* arr, size_t sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%s---%d\n", arr->name, arr->age);
        arr++;
    }
}

//依据结构体中age类型进行排序
test3()
{
    //创建结构体变量
    struct student x[3] = { {"zhangsan",31},{"lisi",17},{"wangwu",10}};
    int sz = sizeof(x) / sizeof(x[0]);
    qsort(x, sz, sizeof(x[0]), compare_by_struct_age);
    Print_struct_age(x, sz);
}
int main()
{
    //根据结构体中age进行排序
    test3();
    return 0;
}